package org.smart4j.framework.helper;

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * description: Servlet 助手类
 * @version v1.0
 * @author w
 * @date 2018年10月25日上午11:26:29
 */
public class ServletHelper {
	
	private static final Logger logger = LoggerFactory.getLogger(ServletHelper.class);
	
	/**
	 * 确保每个线程多有单独的 ServletHelper 实例
	 */
	private static final ThreadLocal<ServletHelper> SERVERT_HELPER_HLODER = new ThreadLocal<>();
	
	private HttpServletRequest request;
	
	private HttpServletResponse response;

	public ServletHelper(HttpServletRequest request, HttpServletResponse response) {
		this.request = request;
		this.response = response;
	}
	
	/**
	 * description: 初始化 
	 * @param request
	 * @param response
	 * @version v1.0
	 * @author w
	 * @date 2018年10月25日 上午11:32:51
	 */
	public static void init(HttpServletRequest request , HttpServletResponse response){
		SERVERT_HELPER_HLODER.set(new ServletHelper(request, response));
	}
	
	/**
	 * description: 销毁 --- 便于 GC 回收
	 * @version v1.0
	 * @author w
	 * @date 2018年10月25日 上午11:33:39
	 */
	public static void destroy(){
		SERVERT_HELPER_HLODER.remove();
	}
	
	/**
	 * description: 获取 request 对象 
	 * @return  request
	 * @version v1.0
	 * @author w
	 * @date 2018年10月25日 上午11:35:55
	 */
	public static HttpServletRequest getRequest(){
		return SERVERT_HELPER_HLODER.get().request;
	}
	
	/**
	 * description: 获取 response 对象 
	 * @return response
	 * @version v1.0
	 * @author w
	 * @date 2018年10月25日 上午11:36:37
	 */
	public static HttpServletResponse getResponse(){
		return SERVERT_HELPER_HLODER.get().response;
	}
	
	/**
	 * description: 获取 session 对象
	 * @return  session
	 * @version v1.0
	 * @author w
	 * @date 2018年10月25日 上午11:37:28
	 */
	public static HttpSession getSession(){
		return getRequest().getSession();
	}
	
	/**
	 * description: 获取 servletContext 对象
	 * @return servletContext
	 * @version v1.0
	 * @author w
	 * @date 2018年10月25日 上午11:38:36
	 */
	public static ServletContext getServletContext(){
		return getRequest().getServletContext();
	}
	
	/**
	 * description: 属性放入 request 对象中
	 * @param key
	 * @param value
	 * @version v1.0
	 * @author w
	 * @date 2018年10月25日 上午11:39:45
	 */
	public static void setAttribute(String key , Object value){
		getRequest().setAttribute(key, value);
	}
	
	/**
	 * description: 从 request 中获取属性
	 * @param key
	 * @return T 
	 * @version v1.0
	 * @author w
	 * @date 2018年10月25日 上午11:48:18
	 */
	@SuppressWarnings("unchecked")
	public static <T> T getAttribute(String key){
		return (T) getRequest().getAttribute(key);
	}
	
	/**
	 * description: 从 request 中移除属性
	 * @param key
	 * @version v1.0
	 * @author w
	 * @date 2018年10月25日 上午11:49:25
	 */
	public static void removeRequestAttribute(String key){
		getRequest().removeAttribute(key);
	}
	
	
	/**
	 * description: 发送 response 重定向响应
	 * @param location 
	 * @version v1.0
	 * @author w
	 * @date 2018年10月25日 上午11:52:25
	 */
	public static void sendRedirect(String location){
		try {
			getResponse().sendRedirect(getRequest().getContextPath()+location);
		} catch (IOException e) {
			logger.error(" send redirect failure ", e);
		}
	}
	
	/**
	 * description: 属性放入 session 对象中
	 * @param key
	 * @param value
	 * @version v1.0
	 * @author w
	 * @date 2018年10月25日 上午11:55:49
	 */
	public static void setSessionAttribute(String key , Object value){
		getSession().setAttribute(key, value);
	}
	
	/**
	 * description: 从session 对象中获取属性
	 * @param key
	 * @return T 
	 * @version v1.0
	 * @author w
	 * @date 2018年10月25日 上午11:56:10
	 */
	@SuppressWarnings("unchecked")
	public static <T> T getSessionAttribte(String key){
		return (T) getSession().getAttribute(key);
	}
	
	/**
	 * description: 从 session 对象中移除属性
	 * @param key
	 * @version v1.0
	 * @author w
	 * @date 2018年10月25日 上午11:56:35
	 */
	public static void removeSessionAttribute(String key){
		getSession().removeAttribute(key);
	}
	
	/**
	 * description: session 对象失效 
	 * @version v1.0
	 * @author w
	 * @date 2018年10月25日 上午11:56:54
	 */
	public static void invalidateSession(){
		getSession().invalidate();
	}
	
}
